home *** CD-ROM | disk | FTP | other *** search
/ HAM Radio 3.2 / Ham Radio Version 3.2 (Chestnut CD-ROMs)(1993).ISO / mods / caty-767 / y767comm.pas < prev    next >
Pascal/Delphi Source File  |  1989-12-09  |  6KB  |  155 lines

  1. UNIT Y767COMM; (* Interrupt driven Serial Comm routines - D. J. Wilke 10/18/89 *)
  2.  
  3. INTERFACE
  4.  
  5. USES CRT, DOS, Y767GLO;
  6.  
  7. PROCEDURE EnableInterrupts;
  8. PROCEDURE CommExitProc;
  9. PROCEDURE SetupSerialPort(ComPort : INTEGER; ComVec : WORD; ComBase,IRQM : INTEGER);
  10. FUNCTION InStat : Boolean;
  11. PROCEDURE FlushBuffer;
  12. FUNCTION InChar : Char;
  13. PROCEDURE OutChar(Ch : Char);
  14. PROCEDURE SendString(Inst : STRING5; SUS : INTEGER);
  15.  
  16. IMPLEMENTATION
  17.  
  18. (*▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓*)
  19. PROCEDURE EnableInterrupts;
  20. BEGIN
  21.     INLINE($FB);                             (* Interrupt Service Routine *)
  22. END;
  23.  
  24. (*▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓*)
  25. PROCEDURE Incoming(Flags,CS,IP,AX,BX,CX,DX,SI,DI,DS,ES,BP : Word);
  26. INTERRUPT;
  27.  
  28. VAR
  29.     RBR : INTEGER;
  30.  
  31. BEGIN
  32.     EnableInterrupts;                        (* Enable ints during the ISR: *)
  33.     RBR               := ComBase;            (* 8250 Receive Buffer Register *)
  34.     IF LastSaved >= 1023 THEN                (* Make 1024-byte circ buffer *)
  35.         LastSaved     := 0
  36.     ELSE Inc(LastSaved);
  37.     Buffer[LastSaved] := Char(Port[RBR]);    (* Read incoming character *)
  38.     Port[OCW2]        := $20;                (* Send EOI byte to 8259 *)
  39. END;
  40.  
  41. (*▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓*)
  42. {$F+}
  43. PROCEDURE CommExitProc;
  44.  
  45. VAR
  46.     RBR,IER,MCR : INTEGER;
  47.  
  48. BEGIN
  49.     RBR        := ComBase;                   (* 8250 Receive Buffer Register *)
  50.     IER        := ComBase + 1;               (* 8250 Interrupt Enable Register *)
  51.     MCR        := ComBase + 4;               (* 8250 Modem Control Register *)
  52.     Port[IER]  := 0;                         (* Disable interrupts at 8250 *)
  53.     Port[OCW1] := Port[OCW1] OR IRQM;        (* Disable IRQ_ at 8259 *)
  54.     Port[MCR]  := 0;                         (* Bring the comm line down *)
  55.     SETINTVEC(ComVec,OldComVec);             (* Restore prev saved vector *)
  56. END;
  57. {$F-}
  58.  
  59. (*▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓*)
  60. PROCEDURE SetupSerialPort(ComPort      : INTEGER;
  61.                           ComVec       : WORD;
  62.                           ComBase,IRQM : INTEGER);
  63.  
  64. VAR
  65.     RBR,THR,DLL,DLM,IER,IIR,LCR,MCR,LSR,MSR : INTEGER;
  66.  
  67. BEGIN
  68.     RBR        := ComBase;                   (* 8250 Receive Buffer Register *)
  69.     THR        := ComBase;                   (* 8250 Transmit Holding Register *)
  70.     DLL        := ComBase;                   (* 8250 Divisor Latch LSB *)
  71.     DLM        := ComBase + 1;               (* 8250 Divisor Latch MSB *)
  72.     IER        := ComBase + 1;               (* 8250 Interrupt Enable Register *)
  73.     IIR        := ComBase + 2;               (* 8250 Interrupt Ident Register *)
  74.     LCR        := ComBase + 3;               (* 8250 Line Control Register *)
  75.     MCR        := ComBase + 4;               (* 8250 Modem Control Register *)
  76.     LSR        := ComBase + 5;               (* 8250 Line Status Register *)
  77.     MSR        := ComBase + 6;               (* 8250 Modem Status Register *)
  78.     LastRead   := 0;                         (* Initialize circ buf pointers *)
  79.     LastSaved  := 0;
  80.     Port[IER]  := 0;                         (* Disable ints while setting up *)
  81.     GETINTVEC(ComVec,OldComVec);             (* Save old IRQ vector *)
  82.     ExitProc   := @CommExitProc;             (* Hook exit proc into chain *)
  83.     SETINTVEC(ComVec,@Incoming);             (* Put ISR addr into vector table *)
  84.     Port[LCR]  := Port[LCR] OR DLAB;         (* Set up 8250 for baud rate *)
  85.     Port[DLL]  := Lo(Divisor);               (* Set baud rate divisor *)
  86.     Port[DLM]  := Hi(Divisor);
  87.     Port[LCR]  := DataBits OR StopBits;      (* Set word length and stop bits *)
  88.     Port[LCR]  := Port[LCR] OR Parity;       (* Set parity *)
  89.     Port[MCR]  := DTR OR RTS OR OUT2;        (* Enable DTR, RTS & adapter *)
  90.     Port[OCW1] := Port[OCW1] AND (NOT IRQM); (* Turn on 8259 IRQ_ ints *)
  91.     Clearit    := Port[RBR];                 (* Clear any garbage from RBR *)
  92.     Clearit    := Port[LSR];                 (* Clear any garbage from LSR *)
  93.     Port[IER]  := $01;                       (* Enable int on received char *)
  94. END;
  95.  
  96. (*▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓*)
  97. FUNCTION InStat : Boolean;
  98.  
  99. BEGIN
  100.     IF LastSaved <> LastRead THEN
  101.         InStat  := True
  102.     ELSE InStat := False;
  103. END;
  104.  
  105. (*▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓*)
  106. PROCEDURE FlushBuffer;
  107.  
  108. VAR
  109.     RBR : INTEGER;
  110.  
  111. BEGIN
  112.     RBR        := ComBase;                   (* 8250 Receive Buffer Register *)
  113.     LastRead   := 0;
  114.     LastSaved  := 0;
  115.     Clearit    := Port[RBR];                 (* Clear any garbage from RBR *)
  116.     FILLCHAR(Buffer,SIZEOF(Buffer),0);
  117. END;
  118.  
  119. (*▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓*)
  120. FUNCTION InChar : Char;                      (* Bring in next char from ring buf *)
  121.  
  122. BEGIN
  123.     IF LastRead >= 1023 THEN
  124.         LastRead  := 0
  125.     ELSE LastRead := Succ(LastRead);
  126.     InChar := Buffer[LastRead];
  127. END;
  128.  
  129. (*▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓*)
  130. PROCEDURE OutChar(Ch : Char);                (* Send a char to the comm port *)
  131.  
  132. VAR
  133.     THR : INTEGER;
  134.  
  135. BEGIN
  136.     THR       := ComBase;                    (* 8250 Transmit Holding Register *)
  137.     Port[THR] := Byte(Ch)                    (* Put char into THR *)
  138. END;
  139.  
  140. (*▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓*)
  141. PROCEDURE SendString(Inst : STRING5; SUS : INTEGER);
  142.  
  143. VAR
  144.     Index : INTEGER;
  145.  
  146. BEGIN
  147.     FOR Index := 1 to LENGTH(Inst) DO BEGIN
  148.         OutChar(Inst[Index]);
  149.         DELAY(10);
  150.     END;
  151.     DELAY(SUS * 3);
  152. END;
  153.  
  154. END. (* UNIT Y767COMM *)
  155.